package com.niit.scala

object Base_04 {

 /*
 1.构造器
  主构造器：
      格式： class 类名(var/val 参数名:类型,var/val 参数名:类型[=默认值])
      有参构造器  无参构造器可以直接把括号省略掉。 有参构造器会默认的取代无参构造器
  辅助构造器:
       名字必须叫this。 格式：def this(参数:类型,参数:类型)
       可以有多个

  */
class Person(var name:String,var age:Int=18,var phone:String){

   def this(arr:Array[String]){
     this( "张三", 0, "120")
     println("辅助构造器：",arr(0),arr(1),arr(2))

   }
 }

  /*
    static：静态。在Scala中是没有static。如果想用静态只能定义对象
    调用： 对象名.属性
   */
object Dog{
    val leg_num = 4
    var name = "旺财"
    def fei(): Unit ={
      println("wangwangwangwangwanwg")
    }
  }

  /*
  在Java中，类里面可以定义成员变量和静态变量以及成员方法和静态方法。如果想在Scala实现这一效果就用到 伴生对象

   一个class和 一个 object的名字是相同，就叫做伴生  object为伴生对象 class为伴生类
   并且这个class和object必须在同一个文件中，
   伴生对象和伴生类可以互相访问private属性
   */

  class Generals{
    def gan(): Unit ={
      println(s"士兵拿着${Generals.wuqi}就是干")
      Generals.printInfo()
    }
  }
  /*
    ↑ ↑ ↑
   互为伴生
    ↓ ↓ ↓
   */
  object Generals{
    private val wuqi = "丈八蛇矛"
    val g = new Generals

    private def printInfo(): Unit ={
      println("手握" + wuqi)
    }
     def printInfo1(): Unit ={
      g.gan()
    }
  }

  //apply方法可以免去实例化操作
  class Animal(var name:String,var age:Int = 2)//只有类型才能实例化
  object Animal{
                                              //在这进行的实例化
    def apply(name: String, age: Int): Animal = new Animal(name, age)
  }

  def main(args: Array[String]): Unit = {
    val p = new Person("张三",20, "110")
    println(p.name)
    val p2 = new Person(Array("李四","北京","棉花胡同36号"))
    println(p2.name)

    Dog.fei()
    Dog.name = "狗子"
    println(Dog.leg_num,Dog.name)

    var g = new Generals
    g.gan()
    Generals.printInfo1()
    // 这里没有写new关键字 就不能说在此处进行了实例化
    val ani = Animal("狗",3)
    println(ani.name,ani.age)
  }

}
